package com.hooper.solution.day4;

import java.util.Arrays;
import java.util.Random;

/**
 * @author Tim Hooper
 * @version 1.0
 * @time 2023/01/31/16:13
 */
public class Solutions {

    /**
     * 977. 有序数组的平方
     * 给你一个按 非递减顺序 排序的整数数组 nums，返回 每个数字的平方 组成的新数组，要求也按 非递减顺序 排序。
     * 示例 1：
     * 输入：nums = [-4,-1,0,3,10]
     * 输出：[0,1,9,16,100]
     * 解释：平方后，数组变为 [16,1,0,9,100]
     * 排序后，数组变为 [0,1,9,16,100]
     * 示例 2：
     * 输入：nums = [-7,-3,2,3,11]
     * 输出：[4,9,9,49,121]
     * 提示：
     * 1 <= nums.length <= 104
     * -104 <= nums[i] <= 104
     * nums 已按 非递减顺序 排序
     */
    public int[] sortedSquares(int[] nums) {
        return Arrays.stream(nums).map(i -> i * i).sorted().toArray();
    }


    /**
     * 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。
     * 比如，输入字符串"abcdefg"和数字2，该函数将返回左旋转两位得到的结果"cdefgab"。
     * 示例 1：
     * 输入: s = "abcdefg", k = 2
     * 输出:"cdefgab"
     * 示例 2：
     * 输入: s = "lrloseumgh", k = 6
     * 输出:"umghlrlose"
     */
    public String reverseLeftWords(String s, int n) {
        Random random = new Random();
        String res = "";
        switch (random.nextInt(3)) {
            case 0:
                res = s.substring(n) + s.substring(0, n);
                break;
            case 1:
                int len = s.length();
                StringBuilder sb = new StringBuilder(len);
                for (int i = n; i < len; i++) {
                    sb.append(s.charAt(i));
                }
                for (int i = 0; i < n; i++) {
                    sb.append(s.charAt(i));
                }
                res = sb.toString();
                break;
            case 2:
                res = (s + s).substring(n, s.length() + n);
                break;
        }
        return res;
    }

    /**
     * 给你一个数组，将数组中的元素向右轮转 k个位置，其中k是非负数。
     * <p>
     * 示例 1:
     * <p>
     * 输入: nums = [1,2,3,4,5,6,7], k = 3
     * 输出: [5,6,7,1,2,3,4]
     * 解释:
     * 向右轮转 1 步: [7,1,2,3,4,5,6]
     * 向右轮转 2 步: [6,7,1,2,3,4,5]
     * 向右轮转 3 步: [5,6,7,1,2,3,4]
     * 示例2:
     * <p>
     * 输入：nums = [-1,-100,3,99], k = 2
     * 输出：[3,99,-1,-100]
     * 解释:
     * 向右轮转 1 步: [99,-1,-100,3]
     * 向右轮转 2 步: [3,99,-1,-100]
     */
    public void rotate(int[] nums, int k) {
        /*
         * nums = "----->-->"; k =3
         * result = "-->----->";
         * reverse "----->-->" we can get "<--<-----"
         * reverse "<--" we can get "--><-----"
         * reverse "<-----" we can get "-->----->"
         */
        int n = nums.length;
        int[] newArr = new int[n];
        for (int i = 0; i < n; ++i) {
            newArr[(i + k) % n] = nums[i];
        }
        System.arraycopy(newArr, 0, nums, 0, n);
    }

    public static void rotate2(int[] nums, int k) {
        int n = nums.length;
        k %= n;
        int[] newArr = new int[n];
        for (int i = 0; i < n; i++) {
            int index = (i + k) % n;
            newArr[index] = nums[i];
        }
        System.arraycopy(newArr, 0, nums, 0, n);
    }

}












